<?php
namespace Zxf5115\Laravel\Local\Upload\Rules;

use Exception;
use Illuminate\Http\UploadedFile;
use Illuminate\Support\Facades\Storage;

use Zxf5115\Laravel\Local\Upload\Utils\Base64FileUtil;


/**
 * @author zhangxiaofei [<1326336909@qq.com>]
 * @dateTime 2025-09-08
 *
 * base64文件验证类
 */
class Base64FileRule
{
  /**
   * 上传资源文件内容验证方法
   *
   * @param string $file base64文件内容
   * @param array|bool $allow 允许上传的文件类型
   * @return void
   */
  public static function verifyFileData(string $file, array|bool $allow = false) : void
  {
    // 上传资源文件是否为空验证
    self::verifyFileExists($file);

    // 上传资源文件有效性验证
    self::verifyFileValid($file);

    // 上传资源文件大小验证
    self::verifyFileSize($file);

    // 上传资源文件类型验证
    self::verifyFileExtension($file, $allow);
  }


  /**
   * 上传资源文件是否为空验证方法
   *
   * @param string $file base64文件内容
   * @return void
   */
  public static function verifyFileExists(string $file) : void
  {
    // 验证文件是否存在
    if(empty($file))
    {
      throw new Exception(__('upload.file_not_found'));
    }
  }


  /**
   * 上传资源文件有效性验证方法
   *
   * @param string $file base64文件内容
   * @return void
   */
  protected static function verifyFileValid(string $file) : void
  {
    // 检查是否包含有效的数据头
    if(!preg_match('/^data:([a-zA-Z0-9\/\+]+);base64,/', $file))
    {
      throw new Exception(__('upload.file_invalid'));
    }
  }


  /**
   * 上传资源文件大小验证方法
   *
   * @param string $file base64文件内容
   * @return void
   */
  protected static function verifyFileSize(string $file) : void
  {
    // 获取文件大小
    $filesize = Base64FileUtil::getFileSize($file);

    // 检查文件大小
    if ($filesize > config('upload.max_size') * 1024)
    {
      throw new Exception(__('upload.file_too_large',[
        'size' => config('upload.max_size')
      ]));
    }
  }


  /**
   * 上传资源文件类型验证方法
   *
   * @param string $file base64文件内容
   * @param array|bool $allow 允许上传的后缀
   * @return void
   */
  protected static function verifyFileExtension(string $file, array|bool $allow = false) : void
  {
    // 获取Base64文件媒体类型
    $mimeType = Base64FileUtil::getFileMimeType($file);

    // 获取base64文件类型
    $extension = Base64FileUtil::getFileExtension($mimeType);

    // 只能上传规定类型
    if(!empty($allow) && !in_array($extension, $allow))
    {
      throw new Exception(__('upload.invalid_file_type', [
        'types' => implode(', ', $allow)
      ]));
    }
  }
}
